package features.advance.leetcode.math.easy;

/**
 *
 *  剑指 Offer 65. 不用加减乘除做加法
 *
 *  难度：简单
 *
 * 写一个函数，求两个整数之和，要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。
 *
 * 示例:
 *
 * 输入: a = 1, b = 1
 * 输出: 2
 *
 * 提示：
 *
 * a, b 均可能是负数或 0
 * 结果不会溢出 32 位整数
 *
 * @author LIN
 * @date 2021-06-02
 */
public class Offer65 {

    public static void main(String[] args) {
        Solution solution = new Solution() {
            /**
             * 补码
             *
             * @param a
             * @param b
             * @return
             */
            @Override
            public int add(int a, int b) {
                return super.add(a, b);
            }
        };

        int a=7,b=1;
        int add = solution.add(a, b);
        System.out.println(add);
//        int multipy = solution.multipy(26767, 30000);
//        System.out.println(multipy == 26767*30000);
//        System.out.println(add);

//        System.out.println(Integer.MIN_VALUE);
//        System.out.println(Integer.MAX_VALUE);
//        System.out.println(Integer.toBinaryString(Integer.MAX_VALUE));
//        System.out.println(Integer.toBinaryString(Integer.MIN_VALUE)+":"+(Integer.toBinaryString(Integer.MIN_VALUE)).length());
//        System.out.println(Integer.toBinaryString(-1));
//        System.out.println(Integer.MAX_VALUE ^ Integer.MIN_VALUE);
//        System.out.println(Integer.toBinaryString(Integer.MIN_VALUE+1));
    }

    static class Solution{
        public int add(int a,int b){
            while(b!=0){
                int c = (a & b) << 1;
                a^=b;
                b=c;
            }
            return a;
        }

        public int multipy(int a,int b){
            int mul = 0;
            for (int i = 0; i < a; i++) {
                mul = add(mul, b);
            }
            return mul;
        }


    }
}
